package com.huc.tools.tools.mongo;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.mongodb.Block;
import com.mongodb.MongoClient;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoDatabase;
import com.mongodb.client.model.Filters;
import org.bson.Document;

import java.util.List;

/**
 * @Author: 胡成
 * @Version: 0.0.1V
 * @Date: 2018/8/6
 * @Description: mongodb工具类
 **/
public class MongoDbTools {

    /**
     * @Author: 胡成
     * @Date:   2018/8/6 15:44
     * @Description: 获取集合对象
     * @param getMongoClient mongodb对象
     * @param dataBaseName mongodb数据库
     * @param collectionName mongodb集合
    **/
    private static MongoCollection<Document> getCollection(MongoClient getMongoClient,String dataBaseName,String collectionName){
        return getDatabase(getMongoClient,dataBaseName).getCollection(collectionName);
    }

    /**
     * @Author: 胡成
     * @Date:   2018/8/6 15:45
     * @Description: 获取数据库
     * @param getMongoClient mongodb对象
     * @param dataBaseName mongodb数据库
    **/
    private static MongoDatabase getDatabase(MongoClient getMongoClient, String dataBaseName){
        return getMongoClient.getDatabase(dataBaseName);
    }

    /**
     * @Author: 胡成
     * @Date:   2018/8/6 14:30
     * @Description: 查询集合中的所有数据
     * @param getMongoClient mongodb对象
     * @param dataBaseName mongodb数据库
     * @param collectionName mongodb集合
    **/
    public static String queryByCollectionName(MongoClient getMongoClient,String dataBaseName, String collectionName){
        MongoCollection<Document> collection = getCollection(getMongoClient,dataBaseName,collectionName);
        JSONArray jsonArray = new JSONArray();
        collection.find().forEach((Block<Document>) document -> jsonArray.add(JSON.toJSON(document)));
        return jsonArray.toJSONString();
    }

    /**
     * @Author: 胡成
     * @Date:   2018/8/6 14:35
     * @Description: 保存单条数据到集合
     * @param document 数据
     * @param getMongoClient mongodb对象
     * @param dataBaseName mongodb数据库
     * @param collectionName mongodb集合
     **/
    public static void saveToColleation(MongoClient getMongoClient,String dataBaseName, String collectionName,Document document){
        MongoCollection<Document> collection = getCollection(getMongoClient,dataBaseName,collectionName);
        collection.insertOne(document);
    }

    /**
     * @Author: 胡成
     * @Date:   2018/8/6 14:42
     * @Description: 保存集合到mongodb集合
     * @param getMongoClient mongodb对象
     * @param dataBaseName mongodb数据库
     * @param collectionName mongodb集合
     * @param list 数据
     **/
    public static void saveListToColleation(MongoClient getMongoClient,String dataBaseName, String collectionName,List<Document> list){
        MongoCollection<Document> collection = getCollection(getMongoClient,dataBaseName,collectionName);
        collection.insertMany(list);
    }

    /**
     * @Author: 胡成
     * @Date:   2018/8/6 15:18
     * @Description: 修改集合中的一条记录
     * @param getMongoClient mongodb对象
     * @param dataBaseName mongodb数据库
     * @param collectionName mongodb集合
     * @param where 条件
     * @param document 修改内容
    **/
    public static void updateOne(MongoClient getMongoClient,String dataBaseName, String collectionName,Document where,Document document){
        MongoCollection<Document> collection = getCollection(getMongoClient,dataBaseName,collectionName);
        collection.updateOne(Filters.eq(where.get("where")+"",Integer.valueOf(where.get("value")+"")),new Document("$set",document));
    }

    /**
     * @Author: 胡成
     * @Date:   2018/8/6 15:40
     * @Description: 修改集合中条件匹配的所有记录
     * @param getMongoClient mongodb对象
     * @param dataBaseName mongodb数据库
     * @param collectionName mongodb集合
     * @param where 条件
     * @param document 修改内容
    **/
    public static void updateMany(MongoClient getMongoClient,String dataBaseName, String collectionName,Document where,Document document){
        MongoCollection<Document> collection = getCollection(getMongoClient,dataBaseName,collectionName);
        collection.updateMany(Filters.eq(where.get("where")+"",Integer.valueOf(where.get("value")+"")),new Document("$set",document));
    }

    /**
     * @Author: 胡成
     * @Date:   2018/8/6 15:42
     * @Description: 删除集合中的数据
     * @param getMongoClient mongodb对象
     * @param dataBaseName mongodb数据库
     * @param collectionName mongodb集合
     * @param where 条件
    **/
    public static void deleteOne(MongoClient getMongoClient,String dataBaseName, String collectionName,Document where){
        MongoCollection<Document> collection = getCollection(getMongoClient,dataBaseName,collectionName);
        collection.deleteOne(Filters.eq(where.get("where")+"",Integer.valueOf(where.get("value")+"")));
    }

    /**
     * @Author: 胡成
     * @Date:   2018/8/6 15:42
     * @Description: 删除集合中所有匹配条件的数据
     * @param getMongoClient mongodb对象
     * @param dataBaseName mongodb数据库
     * @param collectionName mongodb集合
     * @param where 条件
     **/
    public static void deleteMany(MongoClient getMongoClient,String dataBaseName, String collectionName,Document where){
        MongoCollection<Document> collection = getCollection(getMongoClient,dataBaseName,collectionName);
        collection.deleteMany(Filters.eq(where.get("where")+"",Integer.valueOf(where.get("value")+"")));
    }

}
